package sistema;

import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.channels.FileChannel;
import java.util.ArrayList;

import javax.imageio.ImageIO;

import dados.Usuario;


public class Utilitarios {
	
	/*
	 * Copia arquivo de um local para outro
	 */
	public static void copia(File origem,File destino) throws IOException{  
	      FileInputStream fisOrigem = new FileInputStream(origem);  
	      FileOutputStream fisDestino = new FileOutputStream(destino);  
	      FileChannel fcOrigem = fisOrigem.getChannel();    
	      FileChannel fcDestino = fisDestino.getChannel();    
	      fcOrigem.transferTo(0, fcOrigem.size(), fcDestino);    
	      fisOrigem.close();    
	      fisDestino.close();  
	   } 
		
	/*
	 * Efetua login e retorna um usuario
	 */
	public static Usuario efetuaLogin(String email, char[] senha) throws Exception{
		Usuario temp = null;
		if(Verificador.ehEmailValido(email)){
			if(senha.length > 0){
				String pass = "";
				for(char c: senha){
					pass += c;
				}
				if(new File("cadastro.dat").exists()){
					Usuario use = Verificador.autenticaLogin(readArquivoCadastro(), email, pass);
					temp = use;
				}else{
					throw new Exception("Nenhum usuario cadastrado.");
				}
			}else{
				throw new Exception("Digite sua senha.");
			}
		}else{
			throw new Exception("<html>Digite um email valido.<br>nome@host</html>");
		}
		return temp;
	}
	
	/*
	 * Le o arquivo de cadastro de usuarios
	 */
	@SuppressWarnings("unchecked")
	public static ArrayList<Usuario> readArquivoCadastro() throws Exception{
		ArrayList<Usuario> usuariosArq = null;
		ObjectInputStream in = null;
		boolean openIn = false;
		
		try{
			in = new ObjectInputStream(new BufferedInputStream(new FileInputStream("cadastro.dat")));
			usuariosArq = (ArrayList<Usuario>) in.readObject();
			openIn = true;
		}catch(Exception erro){
			throw new Exception(erro.getMessage());
		}finally{
			if(openIn){
				in.close();
			}
		}		
		return usuariosArq;
	}
	
	/*
	 * Escreve no arquivo de cadastro de usuarios
	 */
	public static void writeArquivoCadastro(ArrayList<Usuario> listUsuarios) throws Exception{
		ObjectOutputStream out = null;
		boolean openOut = false;
		
		try{
			out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("cadastro.dat")));
			out.writeObject(listUsuarios);
			openOut = true;
		}catch(Exception erro){
			throw new Exception(erro.getMessage());
		}finally{
			if(openOut){
				out.close();
			}
		}
	}
	
	/*
	 * Salva cadastro de usuario
	 */
	public static void salvaCadastro(Usuario usuario) throws Exception{
		if(new File("cadastro.dat").exists()){
			try{
				ArrayList<Usuario> listUsuarios = readArquivoCadastro();
				if(!Verificador.verificaUsuarioCadastrado(usuario, listUsuarios)){
					listUsuarios.add(usuario);
				}else{
					throw new Exception("O usuario ja existe.");
				}
				writeArquivoCadastro(listUsuarios);
			}catch(Exception erro){
				throw new Exception(erro.getMessage());
			}
			
			
		}else{
			ArrayList<Usuario> newListUsuarios = new ArrayList<Usuario>();
			newListUsuarios.add(usuario);
			try{
				writeArquivoCadastro(newListUsuarios);
			}catch(Exception erro){
				throw new Exception(erro.getMessage());
			}
		}
	}

	//Tratamento de Imagem-----------------------------------------------------------------------------------//IMAGENS
	public static BufferedImage redimensionaImagem(File file, int largura, int altura) throws Exception{
		BufferedImage new_img;
		try{
			BufferedImage imagem = ImageIO.read(file);		
			int novaLargura = largura, novaAltura = altura;
			new_img = new BufferedImage(novaLargura,novaAltura, BufferedImage.TYPE_INT_RGB);
			Graphics2D g = new_img.createGraphics();
			g.drawImage(imagem, 0, 0, novaLargura,novaAltura, null);
			//ImageIO.write(new_img, "JPG", new File(url));
		}catch(IOException erro){
			throw new Exception(erro.getMessage());
		}
		return new_img;
	}
	
	public static void salvaFoto(File imagem, String destino) throws Exception{
		try{
			BufferedImage image = ImageIO.read(imagem);
			ImageIO.write(image, "JPG", new File(destino));
		}catch(Exception erro){
			throw new Exception(erro.getMessage());
		}
	}
	
	//Atualiza painel-------------------------------------------------------------------------------------------------//REPAINT
	public static void repaint(final Component componente){
		java.awt.EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				componente.repaint();
				componente.revalidate();
			}
		});
	}

	/*
	 * Pega a extencao de um arquivo
	 */
	public static String getExtension(File f) {
        String ext = null;
        String s = f.getName();
        int i = s.lastIndexOf('.');

        if (i > 0 &&  i < s.length() - 1) {
            ext = s.substring(i+1).toLowerCase();
        }
        return ext;
    }

	/*
	*Deleta um diretorio do sistema, algoritmo recursivo.
	*/
	public static boolean deletaDiretorio(File dir){
			if(dir.isDirectory()){
			String[] subPastas = dir.list();
			for(int i = 0; i < subPastas.length; i++){
				boolean deletado = deletaDiretorio(new File(dir, subPastas[i]));
				if(!deletado){
					return false;
				}
			}
		}
		return dir.delete();
	}
}
